package cn.rocky.structures.hash_table;

/**
 * 不完美hash, 模拟简单的Hashmap实现，去掉拉链寻址等设计,验证元素哈希索引位置碰撞。
 * @param <K>
 * @param <V>
 */
public class HashMap01<K,V> implements Map<K, V> {

    private final Object[] tab = new Object[8];

    @Override
    public void put(K key, V value) {
        // HashMap01的实现只是通过哈希计算出的下标,散列存放到固定的数组中。那么这样当发生元素下标碰撞时,原有的元素就会被新的元素替换掉。
        int idx = key.hashCode() & (tab.length - 1);
        tab[idx] = value;
    }

    @Override
    public V get(K key) {
        int idx = key.hashCode() & (tab.length - 1);
        return (V) tab[idx];
    }

    public static void main(String[] args) {
        Map<String, String> map = new HashMap01<>();
        map.put("01", "花花");
        map.put("02", "豆豆");
        System.out.println("碰撞前 key：" + "01"+" value：" + map.get("01"));
        System.out.println("碰撞前 key：" + "02"+" value：" + map.get("02"));

        // 下标碰撞
        map.put("09", "蛋蛋");
        map.put("13", "蛋蛋1");
        map.put("12", "苗苗");
        System.out.println("碰撞前 key：01 value：" + map.get("01"));
        System.out.println("碰撞前 key：" + "02"+" value：" + map.get("02"));
        System.out.println("碰撞前 key：01 value：" + map.get("09"));
    }
}
